infer
는 조건부 타입을 보완할때 사용. extends
바깥에서 사용할 수 없다.
예시: ReturnType
은 함수가 반환하는 타입으로 변환
type a = ReturnType<() => void> // void
type b = ReturnType<() => string | number> // string | number
어떻게 정의하는지 살펴보자
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; // R
정의할 때 선언한 타입 말고 구현부에서 사용되는 타입을 가져다 쓸 때 유용하다.
<T>
를 도중에 조건부에서 일시적으로 선언하여 사용하는 것이라고 보면 될 듯.
type FirstArgOfFunc<T> = T extends (
first: infer F,
...args: any[]
) => any
? F
: never;
type SecondArgOfFunc<T> = T extends (
first: any,
second: infer S,
, ...args: any[]
) => any
? S
: never;
type ArrayType<T> = T extends (infer Item)[] ? Item : T